package com.koalac.ironman.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.Log;

public class BitmapUtil {

	/**
	 * 图片按比例大小压缩方法（根据路径获取图片并压缩,返回字节流） float hh = 800f;// 这里设置高度为800f float ww =
	 * 480f;// 这里设置宽度为480f
	 * 
	 * @param srcPath
	 * @return
	 */
	public static ByteArrayOutputStream compressByCale2Stream(String srcPath,
			int maxWidth, int maxHeight, int maxSizeKb) {
		BitmapFactory.Options newOpts = new BitmapFactory.Options();
		// 开始读入图片，此时把options.inJustDecodeBounds 设回true了
		newOpts.inJustDecodeBounds = true;
		Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);// 此时返回bm为空

		newOpts.inJustDecodeBounds = false;
		int w = newOpts.outWidth;
		int h = newOpts.outHeight;
		// 现在主流手机比较多是800*480分辨率，所以高和宽我们设置为
		float hh = maxHeight;// 800f;// 这里设置高度为800f
		float ww = maxWidth;// 480f;// 这里设置宽度为480f
		// 缩放比。由于是固定比例缩放，只用高或者宽其中一个数据进行计算即可
		int be = 1;// be=1表示不缩放
		if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
			be = (int) Math.ceil(newOpts.outWidth / ww);
		} else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放
			be = (int) Math.ceil(newOpts.outHeight / hh);
		}
		if (be <= 0)
			be = 1;
		newOpts.inSampleSize = be;// 设置缩放比例
		// 重新读入图片，注意此时已经把options.inJustDecodeBounds 设回false了
		bitmap = BitmapFactory.decodeFile(srcPath, newOpts);

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法，这里100表示不压缩，把压缩后的数据存放到baos中
		int options = 100;
		while (baos.toByteArray().length / 1024 > 100) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
			baos.reset();// 重置baos即清空baos
			bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%，把压缩后的数据存放到baos中
			options -= 10;// 每次都减少10
		}
		return baos;
	}

	public static Bitmap getBitmap(ByteArrayOutputStream baos) {
		/**
		 * 把压缩后的数据baos存放到ByteArrayInputStream中
		 */
		ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
		return BitmapFactory.decodeStream(isBm);

	}

	/**
	 * 图片转为文件
	 * 
	 * @param bmp
	 * @param filePath
	 * @return
	 * @throws Exception
	 */
	public static boolean saveBitmap2file(Bitmap bmp, String filePath) {
		File targetFile = new File(filePath);
		OutputStream stream = null;
		boolean result = false;
		try {
			if (!targetFile.exists()) {
				targetFile.createNewFile();
			}
			CompressFormat format = Bitmap.CompressFormat.JPEG;
			int quality = 100;
			stream = new FileOutputStream(filePath);
			result = bmp.compress(format, quality, stream);
		} catch (Exception e) {
			e.printStackTrace();
			new RuntimeException();
		} finally {
			try {
				stream.close();
				bmp.recycle();
				stream = null;
				bmp = null;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return result;
	}

	public static byte[] bitmap2ByteArray(final Bitmap bmp,
			final boolean needRecycle) {
		ByteArrayOutputStream output = new ByteArrayOutputStream();
		bmp.compress(CompressFormat.JPEG, 100, output);
		if (needRecycle) {
			bmp.recycle();
		}

		byte[] result = output.toByteArray();
		try {
			output.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}
	
	public static  Bitmap getBitmapFromUri(Context context,Uri uri)
	 {
	  try
	  {
	   // 读取uri所在的图片
	   Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
	   return bitmap;
	  }
	  catch (Exception e)
	  {
	   Log.e("[Android]", e.getMessage());
	   Log.e("[Android]", "目录为：" + uri);
	   e.printStackTrace();
	   return null;
	  }
	 }

	/**
	 * 字节数组转图片
	 * 
	 * @param data
	 * @return
	 */
	public static Bitmap byte2Bitmap(byte[] data) {
		return BitmapFactory.decodeByteArray(data, 0, data.length);
	}

	/**
	 * 从资源转化bitmap
	 * 
	 * @param context
	 * @param resourceId
	 * @return
	 */
	public static Bitmap drawable2Bitmap(Context context, int resourceId) {
		Drawable drawable = context.getResources().getDrawable(resourceId);
		BitmapDrawable bd = (BitmapDrawable) drawable;
		return bd.getBitmap();
	}
	

}
